#include "stdafx.h"
#pragma once
//-------------------------------------------------------------------------------------------------
//Boundary.h  - Behaviour and Properties of a Boundary (or set of points defining a closed shape ) within an Image              
//-------------------------------------------------------------------------------------------------
//FreeBSD License
//Copyright 2011 Will Stott All rights reserved.
//
//Redistribution and use in source and binary forms, with or without modification, are
//permitted provided that the following conditions are met:
//
//   1. Redistributions of source code must retain the above copyright notice, this list of
//      conditions and the following disclaimer.
//
//   2. Redistributions in binary form must reproduce the above copyright notice, this list
//      of conditions and the following disclaimer in the documentation and/or other materials
//      provided with the distribution.
//
//THIS SOFTWARE IS PROVIDED BY Will Stott ``AS IS'' AND ANY EXPRESS OR IMPLIED
//WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
//FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL Will Stott OR
//CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
//CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
//SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
//ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
//NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
//ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
//The views and conclusions contained in the software and documentation are those of the
//authors and should not be interpreted as representing official policies, either expressed
//or implied, of Will Stott.
//
//----Authors--------------------------------------------------------------------------------------
//created by: will.stott@ucl.ac.uk July 2011
//
//----Comments-------------------------------------------------------------------------------------
//
// The following ifdef block is the standard way of creating macros which make exporting 
// from a DLL simpler. All files within this DLL are compiled with the IMAGEPROCLIB_EXPORTS
// symbol defined on the command line. this symbol should not be defined on any project
// that uses this DLL. This way any other project whose source files include this file see 
// IMAGEPROCLIBAPI functions as being imported from a DLL, whereas this DLL sees symbols
// defined with this macro as being exported.
//--------------------------------------------------------------------------------------------------

#ifdef IMAGEPROCLIB_EXPORTS
#define IMAGEPROCLIBAPI __declspec(dllexport)
#else
#define IMAGEPROCLIBAPI __declspec(dllimport)
#endif

#include <vector>
#include "ImagePt.h"
#include "ImageRect.h"

class IMAGEPROCLIBAPI Boundary
{
private:
//#pragma warning(disable:4251)
	std::vector<ImagePt *> _Points;						//set of points describing a shape
//#pragma warning(default:4251)
	bool _Complete;										//does the set of points described a closed shape?
	ImageRect _Extent;									//rectangle in which the boundary exists

public:
	Boundary::Boundary(void);
	virtual Boundary::~Boundary(void);

	size_t		Boundary::Start(int xVal, int yVal);			//adds first point to describe the shape, return zero-based index of point added - i.e. 0
	size_t		Boundary::Extend(int xVal, int yVal);		//adds another point to describe the shape, return zero-based index of point added - i.e. >0
	size_t		Boundary::Close(int xVal, int yVal);			//creates last point at same position as first point, return zero-based index of last point - i.e. > 0. The point values at this index is the same as the point values for the first point of the boundary

	void		Boundary::EraseAllPoints();

	bool		Boundary::IsComplete() { return _Complete; }

	int			Boundary::GetPointCnt() { return _Points.size(); }
	int			Boundary::GetPointX( size_t index) { return  _Points[index]->x; }
	int			Boundary::GetPointY( size_t index) { return  _Points[index]->y; }
	ImageRect  *Boundary::GetExtent() {  return &_Extent; }

private:
	size_t	Boundary::Add(int xVal, int yVal);
	bool	Boundary::ClearAllPoints();
	void	Boundary::SetExtent(int xVal, int yVal);

};


//-------------------------------------------------------------------------------------------------
//			E N D   O F   F I L E
//-------------------------------------------------------------------------------------------------

